#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <unistd.h>
#include <logbase.h>

/*
指针数组与二级指针。
指针数组：保存指针的数组。首先他是一个数组，每个元素为指针变量。
区别二维数组：二维数组，每个元素是一维数组。
区别数组指针：指针指向的连续内存，每个元素是一维数组。
二级指针：保存指针的指针。首先他是一个指针变量，指向的连续空间保存的元素是指针。连续空间与指针数组操作一致。
*/

int main(int argc, char **argv)
{
#define MY_CHECK_ROWS 3
#define MY_CHECK_COLS 2
    short *tmparr[MY_CHECK_ROWS];
    for (int i = 0; i < MY_CHECK_ROWS; i++)
    {
        tmparr[i] = (short *)malloc(sizeof(short) * MY_CHECK_COLS);
        if (!tmparr[i])
        {
            logdebugc("malloc error!");
            return -1;
        }
        for (int j = 0; j < MY_CHECK_COLS; j++)
        {
            // 赋值，第i行，第j列。
            tmparr[i][j] = (i + 1) * (j + 1);
            printf("%03d ", tmparr[i][j]);
        }
        printf("\n");
    }
    {
        // check val type!
        // short int **
        char *tmpchkptr = tmparr;
        // short int * (*)[3]
        tmpchkptr = &tmparr;
        // 应该叫保持指针的数组指针。
        short *(*tmpx)[3] = &tmparr;
        // short int *
        tmpchkptr = tmparr[0];
        // short int *
        tmpchkptr = &tmparr[0][0];
    }

    // printf
    logdebugc("tmparr ptr:%p", tmparr);
    for (int i = 0; i < MY_CHECK_ROWS; i++)
    {
        logdebugc("it's [%d] element", i);
        logdebugc("tmparr[%d]'s ptr:%p, &ptr:%p", i, tmparr[i], &tmparr[i]);
        for (int j = 0; j < MY_CHECK_COLS; j++)
        {
            // 赋值，第i行，第j列。
            logdebugc("tmparr[%d][%d]=%d, &:%p", i, j, tmparr[i][j], &tmparr[i][j]);
        }
    }

    for (int i = 0; i < MY_CHECK_ROWS; i++)
    {
        free(tmparr[i]);
    }
    return 1;
}
